Podsumowanie analizy

Przedmiotem analizy są pomiary zgromadzone z 17 czujników umieszczonych przy panelach fotowoltaicznych. Dane zbierane były co godzinę i zawierają takie informacje, jak: dane geograficzne, dane atmosferyczne i to co jest przedmiotem analizy - wartość wytworzonej energii w kwh. Pomimo dużej liczby atrybutów, tylko niewielka ich liczba jest skorelowana z ilością wytwarzanej energii przez ogniwo fotowoltaiczne. Dane numeryczne są znormalizowane. Część danych miała wartość 0, co mogło wynikać z błędu pomiaru czujników. Brakujące dane zostały uzupełnione przez obliczenie średniej ich wartości z danego okresu. Analiza korelacji atrybutów wykazała, że mnajbardziej skorelowana z ilością wytwarzanej energii jest ilość promieniowania słonecznego.

Wykorzystane biblioteki

library(dplyr)
library(ggplot2)
library(plotly)
library(reshape2)
library(lubridate)
library(caret)
library(corrplot)

Wczytanie danych

measurements <- read.csv("elektrownie.csv")

Podsumowanie zbioru danych

Rozmiar zbioru

dimensions <- dim(measurements)
names(dimensions) <- c("wiersze", "kolumny")
dimensions
## wiersze kolumny 
##  235790      51

Statystyki zbioru danych

summary(measurements)
##        id             idsito          idmodel          idbrand      
##  Min.   :     1   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.: 99646   1st Qu.:0.1000   1st Qu.:0.1670   1st Qu.:0.0830  
##  Median :158594   Median :0.2250   Median :0.2080   Median :0.1670  
##  Mean   :152703   Mean   :0.2147   Mean   :0.2426   Mean   :0.1519  
##  3rd Qu.:217541   3rd Qu.:0.3250   3rd Qu.:0.2920   3rd Qu.:0.1670  
##  Max.   :276488   Max.   :0.4250   Max.   :0.7500   Max.   :0.4170  
##                                                                     
##       lat              lon          ageinmonths          anno     
##  Min.   :0.4150   Min.   :0.1540   Min.   :0.0000   Min.   :2012  
##  1st Qu.:0.4370   1st Qu.:0.6200   1st Qu.:0.0000   1st Qu.:2012  
##  Median :0.4370   Median :0.6240   Median :0.1250   Median :2012  
##  Mean   :0.4495   Mean   :0.5711   Mean   :0.3145   Mean   :2012  
##  3rd Qu.:0.4390   3rd Qu.:0.6300   3rd Qu.:0.7190   3rd Qu.:2013  
##  Max.   :0.5530   Max.   :0.6910   Max.   :1.0000   Max.   :2013  
##                                                                   
##       day              ora                    data       
##  Min.   :0.0000   Min.   :0.000   1/1/2013 10:00:    17  
##  1st Qu.:0.2520   1st Qu.:0.222   1/1/2013 11:00:    17  
##  Median :0.4770   Median :0.500   1/1/2013 12:00:    17  
##  Mean   :0.4812   Mean   :0.500   1/1/2013 13:00:    17  
##  3rd Qu.:0.7100   3rd Qu.:0.778   1/1/2013 14:00:    17  
##  Max.   :1.0000   Max.   :1.000   1/1/2013 15:00:    17  
##                                   (Other)       :235688  
##  temperatura_ambiente  irradiamento       pressure        windspeed      
##  Min.   :0.0450       Min.   :0.0000   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.:0.2120       1st Qu.:0.0000   1st Qu.:0.7480   1st Qu.:0.04200  
##  Median :0.3480       Median :0.0350   Median :0.7530   Median :0.06600  
##  Mean   :0.3734       Mean   :0.1091   Mean   :0.6504   Mean   :0.07622  
##  3rd Qu.:0.5300       3rd Qu.:0.2040   3rd Qu.:0.7550   3rd Qu.:0.10200  
##  Max.   :0.8180       Max.   :0.7100   Max.   :0.7690   Max.   :0.69600  
##                                                                          
##     humidity           icon           dewpoint       windbearing    
##  Min.   :0.1600   Min.   :0.0000   Min.   :0.1390   Min.   :0.0000  
##  1st Qu.:0.5400   1st Qu.:0.0830   1st Qu.:0.5350   1st Qu.:0.3000  
##  Median :0.7000   Median :0.6670   Median :0.6190   Median :0.4780  
##  Mean   :0.6844   Mean   :0.4623   Mean   :0.6055   Mean   :0.4512  
##  3rd Qu.:0.8400   3rd Qu.:0.6670   3rd Qu.:0.6830   3rd Qu.:0.6600  
##  Max.   :1.0000   Max.   :0.7500   Max.   :0.8650   Max.   :0.7690  
##                                                                     
##    cloudcover        tempi             irri         pressurei       
##  Min.   :0.000   Min.   :0.0090   Min.   :0.108   Min.   :0.000000  
##  1st Qu.:0.230   1st Qu.:0.0730   1st Qu.:0.216   1st Qu.:0.000000  
##  Median :0.310   Median :0.1110   Median :0.220   Median :0.000000  
##  Mean   :0.359   Mean   :0.1225   Mean   :0.222   Mean   :0.000237  
##  3rd Qu.:0.510   3rd Qu.:0.1260   3rd Qu.:0.222   3rd Qu.:0.000000  
##  Max.   :1.000   Max.   :0.9830   Max.   :1.000   Max.   :1.000000  
##                                                                     
##    windspeedi        humidityi         dewpointi       windbearingi   
##  Min.   :0.00000   Min.   :0.03400   Min.   :0.0630   Min.   :0.0000  
##  1st Qu.:0.03700   1st Qu.:0.04400   1st Qu.:0.1140   1st Qu.:0.3360  
##  Median :0.03800   Median :0.04400   Median :0.1140   Median :0.3360  
##  Mean   :0.03852   Mean   :0.06384   Mean   :0.1194   Mean   :0.3455  
##  3rd Qu.:0.03900   3rd Qu.:0.06200   3rd Qu.:0.1180   3rd Qu.:0.3390  
##  Max.   :1.00000   Max.   :0.57900   Max.   :0.4150   Max.   :1.0000  
##                                                                       
##   cloudcoveri          dist           altitude         azimuth      
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.1110   Min.   :0.1280  
##  1st Qu.:0.1960   1st Qu.:0.1913   1st Qu.:0.4190   1st Qu.:0.2950  
##  Median :0.1960   Median :0.4590   Median :0.5640   Median :0.4250  
##  Mean   :0.2062   Mean   :0.4686   Mean   :0.5464   Mean   :0.4546  
##  3rd Qu.:0.1980   3rd Qu.:0.7268   3rd Qu.:0.6810   3rd Qu.:0.6350  
##  Max.   :1.0000   Max.   :1.0000   Max.   :0.8840   Max.   :0.8180  
##                                                                     
##    altitudei         azimuthi          pcnm1            pcnm2       
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.0960   1st Qu.:0.2090   1st Qu.:0.3770   1st Qu.:0.2500  
##  Median :0.1360   Median :0.2880   Median :0.3780   Median :0.3770  
##  Mean   :0.2055   Mean   :0.3653   Mean   :0.4224   Mean   :0.3538  
##  3rd Qu.:0.2660   3rd Qu.:0.4820   3rd Qu.:0.3800   3rd Qu.:0.4220  
##  Max.   :0.9820   Max.   :1.0000   Max.   :1.0000   Max.   :0.9720  
##                                                                     
##      pcnm3            pcnm4            pcnm5            pcnm6       
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.5510   1st Qu.:0.3630   1st Qu.:0.3310   1st Qu.:0.3390  
##  Median :0.6050   Median :0.5310   Median :0.4270   Median :0.4930  
##  Mean   :0.6045   Mean   :0.5189   Mean   :0.4165   Mean   :0.4941  
##  3rd Qu.:0.7300   3rd Qu.:0.6340   3rd Qu.:0.4620   3rd Qu.:0.4930  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##                                                                     
##      pcnm7            pcnm8            pcnm9            pcnm10      
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.0310   1st Qu.:0.2040   1st Qu.:0.5270   1st Qu.:0.5530  
##  Median :0.0520   Median :0.4120   Median :0.5320   Median :0.6190  
##  Mean   :0.1142   Mean   :0.4034   Mean   :0.5371   Mean   :0.6276  
##  3rd Qu.:0.1140   3rd Qu.:0.5110   3rd Qu.:0.6000   3rd Qu.:0.7170  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##                                                                     
##      pcnm11           pcnm12           pcnm13           pcnm14      
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.1370   Min.   :0.0000  
##  1st Qu.:0.2570   1st Qu.:0.7480   1st Qu.:0.6140   1st Qu.:0.4320  
##  Median :0.3270   Median :0.7600   Median :0.6140   Median :0.4730  
##  Mean   :0.3236   Mean   :0.7568   Mean   :0.6501   Mean   :0.4893  
##  3rd Qu.:0.3270   3rd Qu.:0.8840   3rd Qu.:0.7380   3rd Qu.:0.5300  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##                                                                     
##      pcnm15       irr_pvgis_mod    irri_pvgis_mod         kwh        
##  Min.   :0.0000   Min.   :0.0000   Min.   :-0.0250   Min.   :0.0000  
##  1st Qu.:0.6120   1st Qu.:0.0000   1st Qu.: 0.1580   1st Qu.:0.0000  
##  Median :0.6140   Median :0.0560   Median : 0.1940   Median :0.0490  
##  Mean   :0.5709   Mean   :0.1767   Mean   : 0.1967   Mean   :0.1688  
##  3rd Qu.:0.6150   3rd Qu.:0.3250   3rd Qu.: 0.2130   3rd Qu.:0.3320  
##  Max.   :1.0000   Max.   :1.0000   Max.   : 1.0060   Max.   :1.0000  
## 

Sprawdzenie czy w zbiorze występuję wartości NA

any(is.na(measurements))
## [1] FALSE

Wartościami NA nie trzeba się zajmować, gdyż nie występują w tym zbiorze.

Sprawdzenie typów poszczególnych kolumn

sapply(measurements,class)
##                   id               idsito              idmodel 
##            "integer"            "numeric"            "numeric" 
##              idbrand                  lat                  lon 
##            "numeric"            "numeric"            "numeric" 
##          ageinmonths                 anno                  day 
##            "numeric"            "integer"            "numeric" 
##                  ora                 data temperatura_ambiente 
##            "numeric"             "factor"            "numeric" 
##         irradiamento             pressure            windspeed 
##            "numeric"            "numeric"            "numeric" 
##             humidity                 icon             dewpoint 
##            "numeric"            "numeric"            "numeric" 
##          windbearing           cloudcover                tempi 
##            "numeric"            "numeric"            "numeric" 
##                 irri            pressurei           windspeedi 
##            "numeric"            "numeric"            "numeric" 
##            humidityi            dewpointi         windbearingi 
##            "numeric"            "numeric"            "numeric" 
##          cloudcoveri                 dist             altitude 
##            "numeric"            "numeric"            "numeric" 
##              azimuth            altitudei             azimuthi 
##            "numeric"            "numeric"            "numeric" 
##                pcnm1                pcnm2                pcnm3 
##            "numeric"            "numeric"            "numeric" 
##                pcnm4                pcnm5                pcnm6 
##            "numeric"            "numeric"            "numeric" 
##                pcnm7                pcnm8                pcnm9 
##            "numeric"            "numeric"            "numeric" 
##               pcnm10               pcnm11               pcnm12 
##            "numeric"            "numeric"            "numeric" 
##               pcnm13               pcnm14               pcnm15 
##            "numeric"            "numeric"            "numeric" 
##        irr_pvgis_mod       irri_pvgis_mod                  kwh 
##            "numeric"            "numeric"            "numeric"

Rozkłady wartości wybranych parametrów

selected <- select(measurements, lat,lon,day,ora, temperatura_ambiente, irradiamento, pressure, windspeed, humidity, cloudcoveri,tempi, irri, pressurei,windspeedi, kwh, altitude)
ggplot(melt(selected),aes(x = value)) + 
    facet_wrap(~variable,ncol=4,scales = "free_x") + geom_histogram(bins = 30) + scale_x_continuous(labels = scales::comma)
## No id variables; using all as measure variables

Opis zmiennych w zbiorze danych

id - identyfikator
idsito - id ogniwa
idmodel - id modelu ogniwa
idbrand - id marki ogniwa
lat -szerekosc geograficzna w której znajduje się czujnik
lon - długość geograficzna w której znajduje się czujnik
ageinmonths - wiek ogniwa fotowoltaicznego
anno - rok
day - dzień
ora - godzina (przyjmuje wartości od 0 do 1, przeskalowana dopowiednio dla godzin do 2.00 do 20.00)
data - data i czas w formacie MM/DD/YYYY HH:MM
temperatura_ambiente - temperatura otoczenia
irradiamento - wielkość promieniowania
pressure - ciśnienie
windspeed - prędkość wiatru
humidity - wilgotność
dewpoint - punkt rosy
cloud cover - zachmurzenie
altitude - wysokość azimuth - azymut
pcnm1 - pcnm15 - pomiary z czujników
kwh - kilowatogodziny

Przygotowanie danych

Wyznaczenie liczby zerowych wartości irradiamento oraz kwh

c(sum(measurements$irradiamento == 0), sum(measurements$kwh == 0))
## [1] 78489 78521

Jak widać w zbiorze jest minimalnie więcej wartości zerowych dla kwh niż irradiamento. Może to wynikać z błędu czujnika, bądź promieniowanie jest zbyt małe, aby wytworzyć jakąkolwiek energię.

Uzupełnienie wartości zerowych dla irradiamento i kwh

measurements$data <- as.POSIXct(strptime(measurements$data, "%m/%d/%Y %k:%M", tz="GMT"))
measurements <- measurements %>% mutate(month = month(data))
measurements <- measurements %>% group_by(idsito, anno, month, ora) %>% mutate(kwh = ifelse(kwh == 0, mean(kwh), kwh))
measurements <- measurements %>% group_by(idsito, anno, month) %>% mutate(irradiamento = ifelse(irradiamento == 0 & kwh > 0, mean(irradiamento), irradiamento))

Stworzona została kolumna month, która będzie pomocna w kolejnych operacjach grupowania. Zerowe wartości kwh zostały zastąpione średnią wartościa kwh danego czujnika, w danym roku, miesiącu i tej samej godzinie. Sytuacje, gdzie irradiamento jest równe 0, a kwh > 0 wydają się być błędne, tzn. trudno uzasadnić sytuację, gdy nie ma promieniowania słonecznego, mimo to wytwarzana jest energia. W tym przypadku wartość irradiamento została zastąpiona srednią wartością danego czujnika, w danym roku i miesiącu.

c(sum(measurements$irradiamento == 0), sum(measurements$kwh == 0))
## [1] 70682 70748

Przeprowadzony zabieg znacznie zmniejszył ilość wartości zerowych irradiamento oraz kwh.

Korelogram

measurements_table <- cor(measurements %>% select(-data))
corrplot(measurements_table, type = "upper", order = "hclust", 
          tl.col = "black", tl.srt = 90, method="square")

Korelogram ukazuje interesujące związki:

  • duża antykorelacja między wytwarzaną energią kwh, a wilgotością humidity. Duża wilgotność występuje w pochmurne dni, co za tym idzie mało światła słonecznego dociera do paneli, które wytwarzają mniej energii
  • silna dodatnia korelacja między ilością nasłonecznienia, a ilością wytwarzanej energii - jest to spodziewana zależność
  • silna korelacja między godziną (ora), a azymutem. Wraz z godziną rośnie kąt, skąd pada światło słoneczne względem północy

Korelacja atrybutów względem kwh

kwh_correlations <- melt(measurements_table['kwh',])
ggplot(kwh_correlations, aes(x=rownames(kwh_correlations), y=value)) + geom_bar(stat="identity") +labs(title = "Korelacja względem atrybutu kwh", x = "Atrybuty", y = "Wartość korelacji") + coord_flip()

Interaktywny wykres prezentujący wytwarzaną energię przez poszczególne ogniwa w ujęciu miesięcznym

wykres <- measurements %>% group_by(idsito,anno,month) %>% summarise(kwh = sum(kwh))
ggplotwykres <- ggplot(data = wykres, aes(month,kwh, frame=idsito, color=factor(anno))) + 
  geom_point() + labs(x="miesiac", y="kwh", color="rok") + scale_y_continuous(limits = c(0, 140))
ggplotly(ggplotwykres,dynamicTicks = TRUE,width = NULL, height = NULL)

Na wykresie można zauważyć, że w miesiącach letnich produkowana jest większa ilość energii niż zimą. Zależność to wydaje się oczywista.

Model uczenia i regresor

measurements_model <- measurements %>% select(idsito, irradiamento, irr_pvgis_mod, humidity, azimuthi, altitude, irri, tempi, ora, day, kwh, month, anno)

set.seed(17)
inTraining <- 
    createDataPartition(
        y = measurements_model$kwh,
        p = .75,
        list = FALSE)

training <- measurements_model[inTraining,]
testing <- measurements_model[-inTraining,]

ctrl <- trainControl(method = "repeatedcv", number = 10, preProcOptions = c("center", "scale"))

fit_rf <- train(kwh ~ ., data = training,method = "rf", trControl = ctrl, ntree = 10)

fit_rf
## Random Forest 
## 
## 176844 samples
##     12 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 1 times) 
## Summary of sample sizes: 159158, 159159, 159160, 159159, 159160, 159160, ... 
## Resampling results across tuning parameters:
## 
##   mtry  RMSE        Rsquared   MAE       
##    2    0.05559508  0.9305261  0.02580427
##    7    0.05366333  0.9350652  0.02371246
##   12    0.05407928  0.9340233  0.02361594
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was mtry = 7.
prediction <- predict(fit_rf, newdata = testing)
defaultSummary(data.frame(pred = prediction, obs = testing$kwh))
##       RMSE   Rsquared        MAE 
## 0.05282206 0.93726031 0.02329320

Do predykcji wykorzystany został Random Forest. Z analizy korelacji względem zmiennej kwh można odkryć, że atrybut kwh jest najbardziej skorelowany ze zmiennymi irradiamento oraz irr_pvgis_mod. Największa ujemna koleracja zmiennej kwh jest ze zmiennymi humidity(wilgotność) oraz azimuthi(azumut).